package com.cn.kabalifemerchants.base;

import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.os.Environment;

import androidx.annotation.NonNull;
import androidx.multidex.MultiDex;
import androidx.multidex.MultiDexApplication;

import com.cn.kabalifemerchants.R;
import com.cn.kabalifemerchants.config.Constants;
import com.cn.kabalifemerchants.config.LoginHelper;
import com.cn.kabalifemerchants.config.ProjectConfig;
import com.cn.kabalifemerchants.utils.CustomActivityManager;
import com.cn.kabalifemerchants.utils.LoggerUtils;
import com.kongzue.dialog.v2.DialogSettings;
import com.lzy.okgo.OkGo;
import com.lzy.okgo.cache.CacheEntity;
import com.lzy.okgo.https.HttpsUtils;
import com.lzy.okgo.interceptor.HttpLoggingInterceptor;
import com.lzy.okgo.model.HttpHeaders;
import com.lzy.okgo.model.HttpParams;
import com.orhanobut.logger.AndroidLogAdapter;
import com.orhanobut.logger.Logger;
import com.scwang.smartrefresh.layout.SmartRefreshLayout;
import com.scwang.smartrefresh.layout.api.DefaultRefreshFooterCreator;
import com.scwang.smartrefresh.layout.api.DefaultRefreshHeaderCreator;
import com.scwang.smartrefresh.layout.api.RefreshFooter;
import com.scwang.smartrefresh.layout.api.RefreshHeader;
import com.scwang.smartrefresh.layout.api.RefreshLayout;
import com.scwang.smartrefresh.layout.constant.SpinnerStyle;
import com.scwang.smartrefresh.layout.footer.ClassicsFooter;
import com.scwang.smartrefresh.layout.header.ClassicsHeader;
import com.tencent.smtt.sdk.QbSdk;
import com.zzhoujay.richtext.RichText;

import java.io.File;
import java.util.concurrent.TimeUnit;
import java.util.logging.Level;

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLSession;

import cn.jpush.android.api.JPushInterface;
import okhttp3.OkHttpClient;


/**
 * Created by xiaolin on 2018/9/19.
 * function
 */

public class MyApplication extends MultiDexApplication {
    private final String TAG = "MyApplication";

    public static Context mContext;
    private static MyApplication sInstance = null;

    /**
     * 这个应 用程序的Context
     * 生命周期是整个应用，应用摧毁，它才摧毁。
     * Dialog中不可用
     */
    public static Context getContext() {
        return mContext;
    }

    /**
     * @return 返回 APP的Application
     */
    public static MyApplication getInstance() {
        return sInstance;
    }

    /**
     * Activity管理器
     */
    private CustomActivityManager mActivityManager = null;

    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(this);
    }

    @Override
    public void onCreate() {
        super.onCreate();
        mActivityManager = new CustomActivityManager();
        mContext = getApplicationContext();
        sInstance = this;
        initOkGo();//okgo
        initLogger(); //logger初始化
        initAllSDK();

        initSmartRefresh();//下拉刷新。上拉加载。

        //kongzuDialog,可以单独在某个页面设置样式
        DialogSettings.style = DialogSettings.STYLE_IOS;
//        DialogSettings.STYLE_IOS   //ios
//        mWxApi = WXAPIFactory.createWXAPI(this, Constants.WE_APPID, true);
//        // 将该app注册到微信
//        mWxApi.registerApp(Constants.WE_APPID);
//        ResourcesManager.getInstace(MobSDK.getContext());
    }

    public void initAllSDK() {
        if (getInstance() == null) return;
        //未同意协议不初始化sdk
        if (!LoginHelper.isAgreeAgreement()) return;

        initFileDir();
        initX5WebView();
        initUmeng();

        RichText.initCacheDir(this);
        RichText.debugMode = true;

        JPushInterface.setDebugMode(true);    // 设置开启日志,发布时请关闭日志
        JPushInterface.init(this);            // 初始化 JPush
    }

    /**
     * 腾讯x5webview
     */
    private void initX5WebView() {
        QbSdk.PreInitCallback cb = new QbSdk.PreInitCallback() {

            @Override
            public void onViewInitFinished(boolean arg0) {
                // TODO Auto-generated method stub
                //x5內核初始化完成的回调，为true表示x5内核加载成功，否则表示x5内核加载失败，会自动切换到系统内核。
                LoggerUtils.d("app x5WebView初始化onViewInitFinished is " + arg0);
            }

            @Override
            public void onCoreInitFinished() {
                // TODO Auto-generated method stub
            }
        };
        //x5内核初始化接口
        QbSdk.initX5Environment(getApplicationContext(), cb);

//        //非wifi情况下，主动下载x5内核
//        QbSdk.setDownloadWithoutWifi(true);
//        //搜集本地tbs内核信息并上报服务器，服务器返回结果决定使用哪个内核。
//        QbSdk.PreInitCallback cb = new QbSdk.PreInitCallback() {
//
//            @Override
//            public void onViewInitFinished(boolean arg0) {
//                // TODO Auto-generated method stub
//                //x5內核初始化完成的回调，为true表示x5内核加载成功，否则表示x5内核加载失败，会自动切换到系统内核。
//                LoggerUtils.d("app x5WebView初始化onViewInitFinished is " + arg0);
//            }
//
//            @Override
//            public void onCoreInitFinished() {
//                // TODO Auto-generated method stub
//                LoggerUtils.d(" x5WebView初始化失敗");
//            }
//        };
//        //x5内核初始化接口
//        QbSdk.initX5Environment(getApplicationContext(), cb);
    }


    /**
     * 获取activity管理器
     *
     * @return CustomActivityManager
     */
    public CustomActivityManager getActivityManager() {
        return mActivityManager;
    }

    /**
     * logger初始化
     */

    private void initLogger() {
        Logger.addLogAdapter(new AndroidLogAdapter());
        LoggerUtils.d("Logger初始化");
    }


    /**
     * OKGo网络请求框架
     */
    private void initOkGo() {
        HttpParams params = new HttpParams();
//        params.put("channel", "APP"); //param支持中文,直接传,不要自己编码
        OkHttpClient.Builder builder = new OkHttpClient.Builder();
        HttpsUtils.SSLParams sslParams1 = HttpsUtils.getSslSocketFactory();
        builder.sslSocketFactory(sslParams1.sSLSocketFactory, sslParams1.trustManager);
        builder.hostnameVerifier(new HostnameVerifier() {
            @Override
            public boolean verify(String hostname, SSLSession session) {
                return true;
            }
        });
        //log相关
        if (Constants.IS_DEBUG) {
            HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor("OkGo");
            loggingInterceptor.setPrintLevel(HttpLoggingInterceptor.Level.BODY);        //log打印级别，决定了log显示的详细程度
            loggingInterceptor.setColorLevel(Level.INFO);                               //log颜色级别，决定了log在控制台显示的颜色
            builder.addInterceptor(loggingInterceptor);                                 //添加OkGo默认debug日志
        }
        //超时时间设置，默认60秒
        builder.readTimeout(OkGo.DEFAULT_MILLISECONDS, TimeUnit.MILLISECONDS);      //全局的读取超时时间
        builder.writeTimeout(OkGo.DEFAULT_MILLISECONDS, TimeUnit.MILLISECONDS);     //全局的写入超时时间
        builder.connectTimeout(OkGo.DEFAULT_MILLISECONDS, TimeUnit.MILLISECONDS);   //全局的连接超时时间
//        必须调用初始化
//        详细说明看GitHub文档：https://github.com/jeasonlzy/
        HttpHeaders commonHeaders = new HttpHeaders();
        commonHeaders.put(HttpHeaders.HEAD_KEY_CONTENT_TYPE, "text/html;text/javascript;application/json; charset=utf-8");
//        commonHeaders.put(HttpHeaders.HEAD_KEY_CONTENT_TYPE,"text/javascript");
        OkGo.getInstance().init(this)
                //必须调用初始化
                .setOkHttpClient(builder.build())               //建议设置OkHttpClient，不设置会使用默认的
//                .setCacheMode(CacheMode.NO_CACHE)               //全局统一缓存模式，默认不使用缓存，可以不传
                .setCacheTime(CacheEntity.CACHE_NEVER_EXPIRE)   //全局统一缓存时间，默认永不过期，可以不传
                .setRetryCount(3)                               //全局统一超时重连次数，默认为三次，那么最差的情况会请求4次(一次原始请求，三次重连请求)，不需要可以设置为0
                .addCommonHeaders(commonHeaders)
                .addCommonParams(params);                       //全局公共参数

    }


    /**
     * 初始化界面缓存目录
     */
    private void initFileDir() {
        File appFile = new File(ProjectConfig.APP_PATH);
        if (!appFile.getParentFile().exists()) {
            appFile.getParentFile().mkdirs();
            LoggerUtils.e("创建成功");
        } else {
            LoggerUtils.e("已经有这个文件");
        }
        File file = this.getExternalFilesDir(Environment.DIRECTORY_PICTURES + ProjectConfig.DIR_IMG);
        if (!file.exists()) file.mkdirs();
    }


    /**
     * 版本名
     */
    public static String getVersionName() {
        return getPackageInfo().versionName;
    }

    /**
     * 版本号
     */
    public static int getVersionCode() {
        return getPackageInfo().versionCode;
    }

    private static PackageInfo getPackageInfo() {
        PackageInfo pi = null;
        try {
            PackageManager packageManager = mContext.getPackageManager();
            pi = packageManager.getPackageInfo(mContext.getPackageName(),
                    PackageManager.GET_CONFIGURATIONS);

            return pi;
        } catch (Exception e) {
            e.printStackTrace();
        }

        return pi;
    }

    /**
     * 下拉刷新，上拉加载。
     */
    private void initSmartRefresh() {
        SmartRefreshLayout.setDefaultRefreshHeaderCreator(new DefaultRefreshHeaderCreator() {
            @NonNull
            @Override
            public RefreshHeader createRefreshHeader(@NonNull Context context, @NonNull RefreshLayout layout) {
                //全局设置主题颜色
//                layout.setPrimaryColorsId(R.color.main_color, android.R.color.white);
//                return new BezierCircleHeader(context);
                ClassicsHeader header = new ClassicsHeader(context);
                header.setAccentColor(getResources().getColor(R.color.colorAccent));
                header.setTextSizeTitle(10);
                header.setTextSizeTime(10);
                header.setDrawableSize(12);//同时设置箭头和图片的大小（dp单位）
                header.setDrawableArrowSize(12);//设置箭头的大小（dp单位）
                header.setDrawableProgressSize(12);//设置图片的大小（dp单位）
                header.setArrowResource(R.drawable.icon_refresh);
                return header;
            }
        });
        SmartRefreshLayout.setDefaultRefreshFooterCreator(new DefaultRefreshFooterCreator() {
            @NonNull
            @Override
            public RefreshFooter createRefreshFooter(@NonNull Context context, @NonNull RefreshLayout layout) {
                //取消内容不满一页时开启上拉加载功能
                layout.setEnableLoadMoreWhenContentNotFull(false);
                layout.setEnableAutoLoadMore(true);//是否启用列表惯性滑动到底部时自动加载更多
//                layout.finishLoadMoreWithNoMoreData();//完成加载并标记没有更多数据 1.0.4
                //指定为经典Footer，默认是 BallPulseFooter
                ClassicsFooter footer = new ClassicsFooter(context);
                footer.setAccentColor(getResources().getColor(R.color.font_black));
                footer.setTextSizeTitle(12);
                footer.setDrawableSize(14);//同时设置箭头和图片的大小（dp单位）
                footer.setDrawableArrowSize(14);//设置箭头的大小（dp单位）
                footer.setDrawableProgressSize(14);//设置图片的大小（dp单位）
                footer.setSpinnerStyle(SpinnerStyle.Translate);
                return footer;
            }
        });


    }

    /**
     * 友盟
     */
    private void initUmeng() {
//        UMConfigure.setLogEnabled(true);
//        //初始化组件化基础库, 统计SDK/推送SDK/分享SDK都必须调用此初始化接口
//        UMConfigure.init(getApplicationContext(), "5f34b9efd30932215477c96b", "Umeng", UMConfigure.DEVICE_TYPE_PHONE, "");
//        PlatformConfig.setWeixin("wx5419c854322ca75c", "d7a286a148cef8a7ed4f89ab39016d7b");
//        PlatformConfig.setQQZone("1110978691", "PJOoh53TPdn0AdgB");
//        PlatformConfig.setQQFileProvider("com.cn.kabalifeuser.fileprovider");
////        PlatformConfig.setSinaWeibo("3274936185", "0ef5e3fe1f8bb7eb06f04b8442151259", "http://sns.whalecloud.com");
//        MobclickAgent.setScenarioType(getApplicationContext(), MobclickAgent.EScenarioType.E_UM_NORMAL);
//        MobclickAgent.setCatchUncaughtExceptions(true);//统计错误日志
//        MobclickAgent.setDebugMode(false);//调试模式
    }

}
